// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.ast.SQLReplaceable;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
// import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;

// import java.util.Collections;
// import java.util.List;

#include "OracleArgumentExpr.h"
#include "../../../../ast/SQLObject.h"
#include "../../visitor/OracleASTVisitor.h"

OracleArgumentExpr::OracleArgumentExpr()
{
}

OracleArgumentExpr::OracleArgumentExpr(string_ptr argumentName, SQLExpr_ptr value)
{
  this->argumentName = argumentName;
  setValue(value);
}

string_ptr OracleArgumentExpr::getArgumentName()
{
  return argumentName;
}

void OracleArgumentExpr::setArgumentName(string_ptr argumentName)
{
  this->argumentName = argumentName;
}

SQLExpr_ptr OracleArgumentExpr::getValue()
{
  return value;
}

void OracleArgumentExpr::setValue(SQLExpr_ptr value)
{
  if (value != nullptr)
  {
    value->setParent(SharedObject(OracleArgumentExpr));
  }
  this->value = value;
}

// @Override
void OracleArgumentExpr::accept0(OracleASTVisitor_ptr visitor)
{
  if (visitor->visit(SharedObject(OracleArgumentExpr)))
  {
    acceptChild(visitor, value);
  }
  visitor->endVisit(SharedObject(OracleArgumentExpr));
}

// @Override
SQLObject_ptr OracleArgumentExpr::clone()
{
  SQLObject_ptr clone_tmp = std::shared_ptr<OracleArgumentExpr>(new OracleArgumentExpr());
  std::shared_ptr<OracleArgumentExpr> x = std::dynamic_pointer_cast<OracleArgumentExpr>(clone_tmp);
  // OracleArgumentExpr x = new OracleArgumentExpr();
  x->argumentName = argumentName;

  if (value != nullptr)
  {
    x->setValue(std::dynamic_pointer_cast<SQLExpr>(value->clone()));
  }

  return x;
}

// @Override
BOOL_ptr OracleArgumentExpr::replace(SQLExpr_ptr expr, SQLExpr_ptr target)
{
  if (value == expr)
  {
    setValue(target);
    return BOOL::TRUE;
  }
  return BOOL::FALSE;
}

// @Override
SQLObject_list_ptr OracleArgumentExpr::getChildren()
{
  SQLObject_list_ptr tmp = std::make_shared<std::list<SQLObject_ptr>>();
  tmp->push_back(this->value);
  return tmp;
}
